﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Komunikator.Core
{
    class Packets
    {
        public const int GG_WELCOME = 0x0001;
        public const int GG_WELCOME_80 = 0x0031;
        public const byte GG_LOGIN_HASH_SHA1 = 0x02;
        public const int GG_LOGIN80_OK = 0x0035;
        public const int GG_LOGIN80_FAILED = 0x0043;
        public const int GG_LOGIN_FAILED = 0x0009;
        public const int GG_LOGIN80 = 0x0031;
        public static int GG_STATUS_NOT_AVAIL = 0x0001;	//Niedostępny
        public static int GG_STATUS_NOT_AVAIL_DESCR	= 0x0015;	//Niedostępny (z opisem)
        public static int GG_STATUS_FFC	= 0x0017;	//PoGGadaj ze mną
        public static int GG_STATUS_FFC_DESCR = 0x0018;	//PoGGadaj ze mną (z opisem)
        public static int GG_STATUS_AVAIL = 0x0002;	//Dostępny
        public static int GG_STATUS_AVAIL_DESCR = 0x0004;	//Dostępny (z opisem)
        public static int GG_STATUS_BUSY = 0x0003;	//Zajęty
        public static int GG_STATUS_BUSY_DESCR = 0x0005;	//Zajęty (z opisem)
        public static int GG_STATUS_DND = 0x0021;	//Nie przeszkadzać
        public static int GG_STATUS_DND_DESCR = 0x0022;	//Nie przeszkadzać (z opisem)
        public static int GG_STATUS_INVISIBLE = 0x0014;	//Niewidoczny
        public static int GG_STATUS_INVISIBLE_DESCR = 0x0016;	//Niewidoczny (z opisem)
        public static int GG_STATUS_BLOCKED = 0x0006;	//Zablokowany
        public static int GG_STATUS_IMAGE_MASK = 0x0100;	//Maska bitowa oznaczająca ustawiony opis graficzny (tylko odbierane)
        public static int GG_STATUS_ADAPT_STATUS_MASK = 0x0400; 	//Maska bitowa informująca serwer, że jeśli istnieje już inne połączenie na tym numerze to nasze ma przyjać jego stan (podany przez nas zostanie zignorowany). Jeśli połączenia innego nie ma, to ustawiany jest stan podany przez nas.
        public static int GG_STATUS_DESCR_MASK = 0x4000;	//Maska bitowa oznaczająca ustawiony opis
        public static int GG_STATUS_FRIENDS_MASK = 0x8000;	//Maska bitowa oznaczająca tryb tylko dla przyjaciół
        public const int GG_NEW_STATUS80 = 0x0038; //zmiana statusu



    }

    struct GGheader
    {
        public int type;	/* typ pakietu */
        public int length;	/* długość reszty pakietu */
    }

    struct GGwelcome
    {
        public int seed;
    }

    struct GGlogin80 {
        public int uin;              /* numer Gadu-Gadu */ //4
        public byte[] language;     /* język: "pl" */ //2
        public byte hash_type;       /* rodzaj funkcji skrótu hasła */ //1
        public byte[] hash;        /* skrót hasła dopełniony \0 */ //64
        public int status;           /* początkowy status połączenia */ //4
        public int flags;            /* początkowe flagi połączenia */ //4
        public int features;         /* opcje protokołu (0x00000367)*/ //4
        public int local_ip;         /* lokalny adres połączeń bezpośrednich (nieużywany) */ //4
        public short local_port;     /* lokalny port połączeń bezpośrednich (nieużywany) */  //2
        public int external_ip;      /* zewnętrzny adres (nieużywany) */ //4
        public short external_port;  /* zewnętrzny port (nieużywany) */ //2
        public byte image_size;      /* maksymalny rozmiar grafiki w KB */ //1
        public byte unknown1;        /* 0x64 */ //1
        public int version_len;      /* długość ciągu z wersją (0x23) */ //4
        public byte[] version;       /* "Gadu-Gadu Client build 10.0.0.10450" (bez \0) */ //35
        public int description_size; /* rozmiar opisu */ //4
        public byte[] description;   /* opis (nie musi wystąpić, bez \0) */ //0
    }

    class GGlogin800
    {
        public int uin;              /* numer Gadu-Gadu */ //4
        public byte[] language = ASCIIEncoding.ASCII.GetBytes("pl");     /* język: "pl" */ //2
        public byte hash_type = Packets.GG_LOGIN_HASH_SHA1;       /* rodzaj funkcji skrótu hasła */ //1
        public byte[] hash;        /* skrót hasła dopełniony \0 */ //64
        public int status = Packets.GG_STATUS_AVAIL;           /* początkowy status połączenia */ //4
        public static int flags = 0x00800003;            /* początkowe flagi połączenia */ //4
        public static int features = 0x00006777;        /* opcje protokołu (0x00000367)*/ //
        public int local_ip = 0;         /* lokalny adres połączeń bezpośrednich (nieużywany) */ //4
        public short local_port = 0;     /* lokalny port połączeń bezpośrednich (nieużywany) */  //2
        public int external_ip = 0;      /* zewnętrzny adres (nieużywany) */ //4
        public short external_port = 0;  /* zewnętrzny port (nieużywany) */ //2
        public byte image_size = 200;      /* maksymalny rozmiar grafiki w KB */ //1
        public byte unknown1 = 100;        /* 0x64 */ //1
        public int version_len = 0x23;      /* długość ciągu z wersją (0x23) */ //4
        public byte[] version;       /* "Gadu-Gadu Client build 10.0.0.10450" (bez \0) */ //35
        public int description_size = 0; /* rozmiar opisu */ //4
        public byte[] description;   /* opis (nie musi wystąpić, bez \0) */ //0

        public GGlogin800()
        {
            language = ASCIIEncoding.ASCII.GetBytes("pl");
            hash = new byte[64];
            version = ASCIIEncoding.ASCII.GetBytes("Gadu-Gadu Client build 10.0.0.10450");
            version_len = version.Length;
        }
    }
        struct GGnewStatus80 {
	    public int status;		/* nowy status */
	    public int flags;              /* nowe flagi */
	    public int description_size;   /* rozmiar opisu */
	    public byte[] description;	/* opis (nie musi wystąpić, bez \0) */
    }

     
}
